function run(genF) {
  // 返回值是Promise
  return new Promise((resolve, reject) => {
    const gen = genF();
    function step(nextF) {
      let next;
      try {
        // 执行该函数，获取一个有着value和done两个属性的对象
        next = nextF();
      } catch (e) {
        // 出现异常则将该Promise变为rejected状态
        reject(e);
      }
      // 判断是否到达末尾，Generator函数到达末尾则将该Promise变为fulfilled状态
      if (next.done) {
        return resolve(next.value);
      }
      // 没到达末尾，则利用Promise封装该value，直到执行完毕，反复调用step函数，实现自动执行
      Promise.resolve(next.value).then((v) => {
        step(() => gen.next(v))
      }, (e) => {
        step(() => gen.throw(e))
      })
    }
    step(() => gen.next(undefined));
  })
}